package estructuras;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Clase para una cola implementada con listas circulares.
 * @author asus
 */
public class CircularListQueue<E> extends AbstractQueue<E> {
    
    /**
     * Contiene el tamaño actual de la cola, según su número de elementos
     */
    protected int count;
    
    /**
     * Contiene los datos de la cola
     */
    protected CircularList data;
    
    /**
     * Constructor de la clase.
     * Post: Construye una nueva cola vacía.
     */
    public CircularListQueue() {
        data = new CircularList();   
        count = 0;
    }
    
    /**
     * Intenta ingresar el elemento a la cola, y regresa un valor booleano que indica si la operación tuvo éxito
     * @param o elemento a ingresar
     * @return true si la operación fue exitosa, false en el caso contrario
     */
    public boolean offer (E o) {
        try {
            data.addFirst(o);
            count++;
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    
    /**
     * Devuelve el primer elemento de la cola, sin retirarlo
     * @return primer elemento de la cola
     */
    public E peek() {
        if (isEmpty()) return null;
        else {
            E obj = poll();
            offer(obj);
            return obj;
        }
    }
  
    /**
     * Devuelve el primer elemento de la cola y lo retira de ésta. 
     * @return primer elemento de la cola
     */
    public E poll() {
        if (isEmpty()) return null;
        else {
            count--;
            return (E) data.removeLast();
        }
    }
    
    /**
     * Devuelve verdadero si la estructura está vacía, falso si no. 
     * @return true si la estructura está vacía, false si no.
     */
    public boolean isEmpty() {
        return data.isEmpty();
    }
    
    /**
     * Devuelve el tamaño actual de la cola.
     * @return int con el tamaño actual de la cola
     */
    public int size() {
        return count;
    }
}
